import 'package:ycbl/model/user.dart';
import 'package:ycbl/utils/log_util.dart';
import 'package:ycbl/utils/user_config.dart';
import 'package:ycbl/widget/provider/base_view_state_model.dart';


/// 顶层 User  ViewModel，用于观察用户的变化
/// 另： LoginStateViewModel（登录状态） 也依赖了 UserViewModel，
/// 所以 UserViewModel 的变化，也会通知 LoginStateViewModel，来改变整体登录状态
class UserViewModel extends BaseViewStateModel {

  User _user;

  User get user => _user;

  /// 可以用 user 来判断用户是否已经登录，
  /// 目前只应该给 LoginStateViewModel 用
  bool get hasUser => user != null;

  UserViewModel() {

    LogUtil.d('init UserViewModel');

    //获取本地 user 数据
    _user = UserConfig.instance.getUser();

    if(_user == null) {
      LogUtil.d('user is null');
    }else{
      LogUtil.d('user userName is ${_user.stuName}');
    }

  }

  /// 保存 User 数据
  saveUser(User user) {

    LogUtil.d('save user');
    _user = user;
    notifyListeners();

    //持久化存储用户数据
    UserConfig.instance.saveUser(user);
  }

  /// 清除用户 eg.退出登录
  clearUser() {

    LogUtil.d('clear user');

    _user = null;
    notifyListeners();

    //清除持久化数据
    UserConfig.instance.saveUser(null);
  }

  /// 修改用户名
  changeUserName(String userName) {
    _user.stuName = userName;
    //通知观察者
    notifyListeners();

    //更改本地数据
    UserConfig.instance.saveUserName(userName);
  }

  /// 修改昵称
  changeNickName(String nickName) {
    _user.nickName = nickName;
    //通知观察者
    notifyListeners();

    //更改本地数据
    UserConfig.instance.saveNickName(nickName);
  }

  /// 修改头像
  changeAvatar(String avatar) {
    _user.stuImg = avatar;
    //通知观察者
    notifyListeners();

    //更改本地数据
    UserConfig.instance.saveAvatar(avatar);
  }

  /// 修改学校
  changeSchool(String school) {
    _user.school = school;
    //通知观察者
    notifyListeners();

    //更改本地数据
    UserConfig.instance.saveSchool(school);
  }


  /// 修改年级id
  changeGradeId(String grade) {
    _user.gradeID = grade;
    //通知观察者
    notifyListeners();

    //更改本地数据
    UserConfig.instance.saveGradeID(grade);
  }
  /// 修改年级
  changeGrade(String grade) {
    _user.grade = grade;
    //通知观察者
    notifyListeners();

    //更改本地数据
    UserConfig.instance.saveGrade(grade);
  }

  /// 修改性别
  changeSex(String sex) {
    _user.sex = sex;
    //通知观察者
    notifyListeners();

    //更改本地数据
    UserConfig.instance.saveSex(sex);
  }
}